package tencent.xiaociaole;

import java.util.LinkedList;
import java.util.List;

/**
 * @ProjectName: tencent
 * @Package: tencent.xiaociaole
 * @ClassName: Soution01
 * @Author: xxx
 * @Description: 有—个长度为n的仅有1-9这9个数字组成的串。如果相邻三个数之和为16，
 * 则可以将这三个数进行消除,在原串中抹去。求这个长度为n的串最小可以被消成长度为多少的串。如，输入串21583968。
 * 5+8+3之和为16，可以消除，原串变为21968。1+9+6之和为16，可以消除，串变为28,无法进一步消除。返回2。
 * @Date: 2021/5/18 23:24
 */
public class Soution01 {

    public static void main(String[] args) {

        // 1. 测试是存在非数字
        // 1.1 全为非数字：原样输出
        String input11 = "aafd,.";
        System.out.println("-------------------------------------");
        System.out.println("原数组：" + input11);
        test(input11);
        // 1.2 非数字在首位：原样输出
        String input12 = "a21583968";
        System.out.println("-------------------------------------");
        System.out.println("原数组：" + input12);
        test(input12);
        // 1.3 非数字在中间：原样输出
        String input13 = "2158a3968";
        System.out.println("-------------------------------------");
        System.out.println("原数组：" + input13);
        test(input13);
        // 1.4 非数字在末尾：原样输出
        String input14 = "21583968a";
        System.out.println("-------------------------------------");
        System.out.println("原数组：" + input14);
        test(input14);
        // 正常数字测试
        // 2. 测试字符串长度：小于长度3，原样输出；长度大于等于3，不满足消除条件，原样输出；满足消除条件在第3组测试用例测试
        // 2.1 空: 原样输出
        String input21 = "";
        System.out.println("-------------------------------------");
        System.out.println("原数组：" + input21);
        test(input21);
        // 2.2 一个数字：原样输出
        String input22 = "1";
        System.out.println("-------------------------------------");
        System.out.println("原数组：" + input22);
        test(input22);
        // 2.3 两个数字：原样输出
        String input23 = "12";
        System.out.println("-------------------------------------");
        System.out.println("原数组：" + input23);
        test(input23);
        // 2.4 三个数字：原样输出
        String input24 = "123";
        System.out.println("-------------------------------------");
        System.out.println("原数组：" + input24);
        test(input24);
        // 2.5 四个数字：原样输出
        String input25 = "1234";
        System.out.println("-------------------------------------");
        System.out.println("原数组：" + input25);
        test(input25);
        // 3. 消除测试
        // 3.1 存在一组可消除：消除三个
        String input31 = "215839";
        System.out.println("-------------------------------------");
        System.out.println("原数组：" + input31);
        test(input31);
        // 3.2 存在两组可消除：消除六个
        // 3.2.1 两组可消除左右相邻
        String input321 = "21583196";
        System.out.println("-------------------------------------");
        System.out.println("原数组：" + input321);
        test(input321);
        // 3.2.2 两组可消除不相邻
        String input322 = "2158311196";
        System.out.println("-------------------------------------");
        System.out.println("原数组：" + input322);
        test(input322);
        // 3.2.3 第二组可消除被第一组可消除分隔
        String input323 = "2158396";
        System.out.println("-------------------------------------");
        System.out.println("原数组：" + input323);
        test(input323);
        // 4. 存在多种消除方案
        // 4.1 多种消除方案最终长度相同
        String input41 = "21583961";
        System.out.println("-------------------------------------");
        System.out.println("原数组：" + input41);
        test(input41);
        // 4.2 多种消除方案最终长度不同
        String input42 = "";
        // 5. 测试刚好完全消完
        String input5 = "215839686";
        System.out.println("-------------------------------------");
        System.out.println("原数组：" + input5);
        test(input5);
        System.out.println("-------------------------------------");
        // 6. 性能测试
        // 6.1 处理多组数据 1000组
        String[] input61 = gennerateArray(1000, Integer.MAX_VALUE);
        Long start = System.currentTimeMillis();
        for (int i = 0; i < input61.length; i++) {
            System.out.println("原数组：" + input61[i]);
            test(input61[i]);
            System.out.println("-------------------------------------");
        }
        Long end = System.currentTimeMillis();
        System.out.println("处理1000组数据需要时长" + (end - start) + "ms");
    }

    /**
     * 生成随机数组
     * @param len 数组长度
     * @param max 随机数最大值
     * @return 随机数组
     */
    public static String[]  gennerateArray(int len,int max){
        String[] arr=new String[len];
        for(int i=0;i<arr.length;i++){
            arr[i]=((int)(Math.random()*max)) + "";
        }
        return arr;
    }

    /**
     * 三个相邻数字和为16，消除
     * @param input 输入字符串
     * @return
     */
    private static boolean test(String input) {
        // 长度小于三，直接返回，不处理
        if (input.length() < 3) {
            System.out.println(input);
            return true;
        }
        // 删除的话，用LinkedList快
        List<Integer> integers = new LinkedList<>();
        for (char c : input.toCharArray()) {
            if (Character.getNumericValue(c) >= 0 && Character.getNumericValue(c) <= 9 ) {
                integers.add(Character.getNumericValue(c));
            } else {
                // 存在非字母，原样输出
                System.out.println(input);
                return true;
            }
        }

        for (int i = 0; i < integers.size() - 2; i++) {
            // 打印每一步消除后数组长度
//            System.out.println(integers.size());
            if (integers.get(i) + integers.get(i+1) + integers.get(i+2) == 16) {
                integers.remove(i);
                integers.remove(i);
                integers.remove(i);
                i = -1;
            }
            // 打印每一步消除后数组
            System.out.println(integers);
        }
        System.out.println(integers);
        return false;
    }
}
